<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/common.js"></script>
    <style>
        #createCode {
            user-select: none;
        }
    </style>
</head>

<body>
    <!-- -->
    <div class="box">
        <p>
            <label for="">用户名:</label>
            <input type="text" id="user">
            <span id="user_span"></span>
        </p>
        <p>
            <label for="">密&emsp;码:</label>
            <input type="text" id="pwd">
            <span id="pwd_span"></span>
        </p>
        <p>
            <label for="">确&emsp;认:</label>
            <input type="text" id="repwd">
            <span id="repwd_span"></span>
        </p>
        <p>
            <label for="">验证码:</label>
            <input type="text" id="code">
            <span id="createCode">a1b2</span>
            <span id="code_span"></span>
        </p>
        <p>
            <input id="btn" type="submit" value="注册">
        </p>
    </div>
</body>
<script>
    // 用户名
    // 由数字 大小写字母 _ $ 组成 , 6-12位,且不能以数字开头

    // 判断的流程  从易到难的顺序
    // a. 长度  6-12位    =>  失败:用户名需要在6-12位之间
    // b. 不能以数字开头   =>  失败:用户名不能以数字开头
    // c. 由数字 大小写字母 _ $ 组成  (所有的字符都必须在合法字符的范围内,只要有一个不是合法的字符 报错   => 判断字符串中是否能含有非法字符)


    // 密码
    // 由数字 大小写字母 _ 组成   6-12位

    // 判断密码强度
    // 数字,大写,小写,特殊字符  中 只出现一种   11111   aaaaaa  AAAAAA   弱
    // 数字,大写,小写,特殊字符  中 出现2种      11111a  a1111   aAAAAA   中
    // 数字,大写,小写,特殊字符  中 出现3种      1aA                      强
    // 数字,大写,小写,特殊字符  中 出现4种      1aA_                     超强

    // 是否存在数字  / 大写 /小写 / 特殊字符

    // true + true + true + false  => 3

    // 确认密码
    // 和密码相同   => 两次密码输入不一致

    // 验证码  => 封装一个方法可以随机生成四位验证码 (0-9 a-z A-Z )
    // 1. 页面加载时,随机生成四个不重复的验证码 (0-9 a-z A-Z )   => createCode
    // 2. 点击 验证码 进行切换
    // 3. 验证码输入判断  (输入的  随机生成的  保持一致) 






</script>
<script>
    var userInp = document.getElementById("user");
    var userSpan = document.getElementById("user_span");

    var pwdInp = document.getElementById("pwd");
    var pwdSpan = document.getElementById("pwd_span");

    var repwdInp = document.getElementById("repwd");
    var repwdSpan = document.getElementById("repwd_span");

    var codeInp = document.getElementById("code");
    var codeSpan = document.getElementById("code_span");
    var createCode = document.getElementById("createCode");

    var btn = document.getElementById("btn");

    // 注意:
    // JS操作元素改变样式时,都是通过内联样式实现的
    //  <span id="user_span" style="font-size:12px;color: red;"></span>
    // userSpan.style

    // 编码 (ASCII 编码)
    // 数字  48 - 57    charCode>=48 && charCode <= 57
    // 大写  65 - 90    charCode>=65 && charCode <= 90 
    // 小写  97 - 122    charCode>=97 && charCode <= 122 
    // _ $   95   36    charCode==95 || charCode==36

    // 合法范围    
    // (charCode>=48 && charCode <= 57 || charCode>=65 && charCode <= 90 ||  charCode>=97 && charCode <= 122  ||  charCode==95 || charCode==36)

    // 非法范围 
    // !(charCode>=48 && charCode <= 57 || charCode>=65 && charCode <= 90 ||  charCode>=97 && charCode <= 122  ||  charCode==95 || charCode==36)


    // 创建一个数组 包含 数字 字母 下划线 $  => 合法范围的集合 
    // 在集合中就是合法字符  否则非法字符

    // var numList = [];
    // for (var i = 48; i <= 57; i++) {
    //     var char = String.fromCharCode(i);
    //     numList.push(char);
    // }
    // console.log(numList);

    // var smallList = [];
    // for (var i = 97; i <= 122; i++) {
    //     var char = String.fromCharCode(i);
    //     smallList.push(char);
    // }
    // console.log(smallList);

    // var bigList = [];
    // for (var i = 65; i <= 90; i++) {
    //     var char = String.fromCharCode(i);
    //     bigList.push(char);
    // }
    // console.log(bigList);

    // var speList = ["_", "$"]; //允许使用的特殊字符

    // var normalList = numList.concat(smallList, bigList, speList);
    // console.log(normalList);

    createCode.innerText = randCode();

    createCode.onclick = function () {
        createCode.innerText = randCode();
    }

    btn.onclick = function () {
        var user = userInp.value;
        var pwd = pwdInp.value;
        var repwd = repwdInp.value;
        var code = codeInp.value; // 用户输入
        var judgeCode = createCode.innerText;  // 随机的

        // 用户名长度验证
        if (user.length >= 6 && user.length <= 12) {

            // 首字母验证  =>  用户名不能以数字开头 (非数字开头)
            var firstChar = user.charAt(0);
            // if (!(firstChar >= 0 && firstChar <= 9)) {
            //     userSpan.innerText = "√";
            //     userSpan.style.fontSize = "12px";
            //     userSpan.style.color = "green";
            // } else {
            //     userSpan.innerText = "用户名不能以数字开头";
            //     userSpan.style.fontSize = "12px";
            //     userSpan.style.color = "red";
            // }


            if (isNaN(firstChar)) {  // 非数字 => true


                // 判断字符组成  由数字 大小写字母 _ $ 组成  (所有的字符都必须在合法字符的范围内,只要有一个不是合法的字符 报错   => 判断字符串中是否能含有非法字符)




                var flag = true; // 假设都是合法的

                for (var i = 0; i < user.length; i++) {
                    var char = user.charAt(i);
                    if (normalList.indexOf(char) == -1) {  // 如果存在非法字符
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    userSpan.innerText = "√";
                    userSpan.style.fontSize = "12px";
                    userSpan.style.color = "green";
                } else {
                    userSpan.innerText = "用户名由数字、字母、下划线、$组成";
                    userSpan.style.fontSize = "12px";
                    userSpan.style.color = "red";
                }




            } else {
                userSpan.innerText = "用户名不能以数字开头";
                userSpan.style.fontSize = "12px";
                userSpan.style.color = "red";
            }


        } else {
            userSpan.innerText = "用户名需要在6-12位之间";
            userSpan.style.fontSize = "12px";
            userSpan.style.color = "red";
        }

        var isPwdOk = false;
        if (pwd.length >= 6 && pwd.length <= 12) {

            // 判断字符组成  由数字 大小写字母 _ $ 组成  (所有的字符都必须在合法字符的范围内,只要有一个不是合法的字符 报错   => 判断字符串中是否能含有非法字符)

            var flag = true; // 假设都是合法的

            for (var i = 0; i < pwd.length; i++) {
                var char = pwd.charAt(i);
                if (normalList.indexOf(char) == -1) {  // 如果存在非法字符
                    flag = false;
                    break;
                }
            }
            if (flag) {


                // 判断密码强度
                // 数字,大写,小写,特殊字符  中 只出现一种   11111   aaaaaa  AAAAAA   弱
                // 数字,大写,小写,特殊字符  中 出现2种      11111a  a1111   aAAAAA   中
                // 数字,大写,小写,特殊字符  中 出现3种      1aA                      强
                // 数字,大写,小写,特殊字符  中 出现4种      1aA_                     超强
                // 是否存在数字  / 大写 /小写 / 特殊字符

                // true + true + true + false  => 3

                var isExistNum = false; // 假设不存在数字
                var isExistSmall = false;
                var isExistBig = false;
                var isExistSpe = false;

                for (var char of pwd) {
                    // 有一个字符在 numList中  => 存在数字
                    if (numList.includes(char)) isExistNum = true;
                    if (smallList.includes(char)) isExistSmall = true;
                    if (bigList.includes(char)) isExistBig = true;
                    if (speList.includes(char)) isExistSpe = true;
                }

                var level = isExistNum + isExistSmall + isExistBig + isExistSpe;

                switch (level) {
                    case 1: pwdSpan.innerText = "密码强度:弱"; break;
                    case 2: pwdSpan.innerText = "密码强度:中"; break;
                    case 3: pwdSpan.innerText = "密码强度:强"; break;
                    case 4: pwdSpan.innerText = "密码强度:超强"; break;
                    default:
                        break;
                }


                pwdSpan.style.fontSize = "12px";
                pwdSpan.style.color = "green";

                isPwdOk = true;

            } else {
                pwdSpan.innerText = "密码由数字、字母、下划线、$组成";
                pwdSpan.style.fontSize = "12px";
                pwdSpan.style.color = "red";
            }


        } else {
            pwdSpan.innerText = "密码需要在6-12位之间";
            pwdSpan.style.fontSize = "12px";
            pwdSpan.style.color = "red";
        }



        if (isPwdOk) {
            if (pwd === repwd) {
                repwdSpan.innerText = "√";
                repwdSpan.style.fontSize = "12px";
                repwdSpan.style.color = "green";
            } else {
                repwdSpan.innerText = "两次输入不一致";
                repwdSpan.style.fontSize = "12px";
                repwdSpan.style.color = "red";
            }

        } else {
            repwdSpan.innerText = "密码格式有误,请先修改密码";
            repwdSpan.style.fontSize = "12px";
            repwdSpan.style.color = "red";
        }

        if (code.toLowerCase() === judgeCode.toLowerCase()) {
            codeSpan.innerText = "√";
            codeSpan.style.fontSize = "12px";
            codeSpan.style.color = "green";
        } else {
            codeSpan.innerText = "验证码有误";
            codeSpan.style.fontSize = "12px";
            codeSpan.style.color = "red";
        }


    }




</script>

</html>